import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

/**
 * 剑指offer 2 91.粉刷房子
 * 假如有一排房子，共 n 个，每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种，你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。
 * <p>
 * 当然，因为市场上不同颜色油漆的价格不同，所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵 costs 来表示的。
 * <p>
 * 例如，costs[0][0] 表示第 0 号房子粉刷成红色的成本花费；costs[1][2] 表示第 1 号房子粉刷成绿色的花费，以此类推。
 * <p>
 * 请计算出粉刷完所有房子最少的花费成本。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/JEj789
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class MinCost {


    @Test
    public void test1() {
        Assertions.assertEquals(10, minCost(new int[][]{
                {17, 2, 17},
                {16, 16, 5},
                {14, 3, 19}
        }));
    }

    @Test
    public void test2() {
        Assertions.assertEquals(2, minCost(new int[][]{
                {7, 6, 2},

        }));
    }

    @Test
    public void test3() {
        Assertions.assertEquals(43, minCost(new int[][]{
                        {5, 8, 6},
                        {19, 14, 13},
                        {7, 5, 12},
                        {14, 15, 17},
                        {3, 20, 10}
                }

        ));
    }


    public int minCost(int[][] costs) {

        int[][] homeIndexColorCost = new int[costs.length][costs[0].length];

        homeIndexColorCost[0][0] = costs[0][0];
        homeIndexColorCost[0][1] = costs[0][1];
        homeIndexColorCost[0][2] = costs[0][2];


        for (int i = 1; i < costs.length; i++) {



            homeIndexColorCost[i][0] = costs[i][0] + Math.min(homeIndexColorCost[i - 1][1], homeIndexColorCost[i - 1][2]);
            homeIndexColorCost[i][1] = costs[i][1] + Math.min(homeIndexColorCost[i - 1][0], homeIndexColorCost[i - 1][2]);
            homeIndexColorCost[i][2] = costs[i][2] + Math.min(homeIndexColorCost[i - 1][0], homeIndexColorCost[i - 1][1]);
        }
        int[] lastHomeCost = homeIndexColorCost[homeIndexColorCost.length - 1];

        return Math.min(lastHomeCost[0], Math.min(lastHomeCost[1], lastHomeCost[2]));
    }
}
